# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn import feature_selection
from sklearn.svm import SVC
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
from sklearn.preprocessing import PolynomialFeatures as plf
from sklearn.ensemble import GradientBoostingClassifier as GBDT
from sklearn.decomposition import PCA
'''
****************特征工程**********************
1.所谓特征工程，就是对指标（特征指标）进行选择、降维、组合，提高模型效果的过程
2.特征选择的三种形式
  #1）从原始指标中筛选或者选择，处理的指标个数小于原数据集
  #2）对原始指标通过数学变换，获得综合指标，处理的指标个数小于原数据集
  #3）对原始指标通过数学变换、组合，获得新指标，处理的指标个数有可能大于原始数据集
3.任务如下：
  #1）读取data1.txt数据，其中最后一列为目标变量y的值，其余为自变量x
  #2）对x,利用sklearn库特征选择模块feature_selection中的SelectPercentile、
      VarianceThreshold、RFE和SelectFromModel的方法，进行特征选择，输出数据集分别为：
      sel_features1、sel_features2、sel_features3、sel_features4
  #3）对x，利用sklearn库PCA（主成分分析）方法，获取综合指标（主成分），
      要求累计贡献在95%以上，输出数据集为pca_features
  #4）对x,利用sklearn库的LAD、 GBDT和多项式，进行特征组合，输出数据集分别为:
      LAD_features、GBDT_features、plf_features
'''
#-----------------------------------------------------------------------------------------------------------------
#1.读取data1.txt数据

data=np.loadtxt('data1.txt')
#获取自变量x,以及目标变量y
x=data[:,:-1]
y=data[:,-1]

#-----------------------------------------------------------------------------------------------------------------
#-----------------------------------------------------------------------------------------------------------------
#2.对x,利用sklearn库特征选择模块feature_selection中的
#selectPercentile、VarianceThreshold、RFE和SelectFromModel的方法，进行特征选择，输出数据集分别为：
#sel_features1、sel_features2、sel_features3、sel_features4

#（1）使用selectPercentile进行特征选择
#选取总体的30%的特征
selector_1=feature_selection.SelectPercentile(percentile=30)
sel_features1=selector_1.fit_transform(x,y)
#print(sel_features1)


#（2)指定阈值为1，即方差高于1的特征才能够被留下来
selector_2=feature_selection.VarianceThreshold(1)#设置阈值为1
sel_features2=selector_2.fit_transform(x)#训练并转化数据

#（3）
#设置SVC作为基础模型，并设置线性核，在RFE中指定保留3个得分最高的
model_svc=SVC(kernel='linear')
selector_3=feature_selection.RFE(model_svc,3)
sel_features3=selector_3.fit_transform(x,y)

#(4)
#建立分类决策树模型对象，这里不设置特征重要的过滤阈值，使用默认值None
model_tree=DecisionTreeClassifier(random_state=0)
selector_4=feature_selection.SelectFromModel(model_tree)
sel_features4=selector_4.fit_transform(x,y)

#-------------------------------------------------------------------------------------------------------
#-------------------------------------------------------------------------------------------------------
#3.对x，利用sklearn库PCA（主成分分析）方法，获取综合指标（主成分），要求累计贡献在95%以上，输出数据集为pca_features
pca=PCA(n_components=0.95)          #这里设置累计贡献率为95%以上。
pca.fit(x)
pca_features=pca.transform(x)


#---------------------------------------------------------------------------------------------------
#----------------------------------------------------------------------------------------------------
#4.对x,利用sklearn库的LDA、 GBDT和多项式，进行特征组合，输出数据集分别为:
      #LAD_features、GBDT_features、plf_features

#4.1 使用LDA进行维度转换，数据集中带有Label(分类标志)，转化后只有1个特征
model_lda=LDA()
model_lda.fit(x,y)
lda_features=model_lda.transform(x)
#printmodel_lda.explained_variance_ratio_)------获得各成分解释方差占比

#4.2 使用GBDT进行，使用apply做特征提取，返回的是叶子的索引，默认情况下，其形状为:
#[n_samples,n_estimators,n_classes],若果是在二分类情况下，n_classes为1,一般情况下sklearn算法中
#和模型用到的输入数据都是二维空间矩阵，这里只取[n_samples,n_estimators]
model_gbdt=GBDT()
model_gbdt.fit(x,y)
GBDT_features=model_gbdt.apply(x)[:,:,0]
#print(GBDT_features.shape)
#print(GBDT_feature[0])

#4.3 使用多项式进行,（指定的多项式的项数为2（degree的值为2，建立多项式对象model_plf后，
#直接使用fit_transform方法，然后输出转化后的第一条数据
model_plf=plf(2)
plf_features=model_plf.fit_transform(x,y)
#打印第一条数据
#print(plf_features[0])










